package org.niux.aims.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.niux.aims.dao.IAccountDAO;
import org.niux.aims.models.Account;
import org.niux.aims.models.EntityManagerHelper;
import org.springframework.stereotype.Repository;

/**
 * 
 * Copyright (c) 2009,niux<br>
 * All rights reserved.<br>
 * 
 * 文件名称：AccountDAO.java<br>
 * 摘    要：账户数据操作类<br>
 * <br>
 * 当前版本：<br>
 * 作    者：铭显 Email: <a href="mailto:liangmingxian@gmail.com">liangmingxian@gmail.com</a><br>
 * 完成日期：@since 2013-7-30<br>
 * <br>
 * 取代版本：<br>
 * 原作者  ：<br>
 * 完成日期：@since Oct 22, 2009<br>
 */
@Repository(value="accountDao")
public class AccountDAO implements IAccountDAO {
	// property constants
	public static final String NAME = "name";
	public static final String PASSWORD = "password";

	private EntityManager getEntityManager() {
		return EntityManagerHelper.getEntityManager();
	}

	/**
	 * 
	 * 方法概述：新增账户数据
	 * 描述：新增账户数据
	 * @param entity
	 * 返回类型：
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public void save(Account entity) {
		try {
			getEntityManager().getTransaction().begin();
			getEntityManager().persist(entity);
			getEntityManager().getTransaction().commit();
		} catch (RuntimeException re) {
			throw re;
		}
	}

	/**
	 * 
	 * 方法概述：删除账户数据
	 * 描述：删除账户数据
	 * @param entity
	 * 返回类型：
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public void delete(Account entity) {
		try {
			entity = findById(entity.getId());

			entity.getApplication().getAccounts().clear();
//			entity.setApplication(null);
			
			getEntityManager().getTransaction().begin();
			getEntityManager().remove(entity);
			getEntityManager().getTransaction().commit();
			
		} catch (RuntimeException re) {
			throw re;
		}
	}

	/**
	 * 
	 * 方法概述：修改账户
	 * 描述：修改账户
	 * @param entity
	 * @return
	 * 返回类型：
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	public Account update(Account entity) {
		try {
			getEntityManager().getTransaction().begin();
			Account result = getEntityManager().merge(entity);
			getEntityManager().getTransaction().commit();
			return result;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	/**
	 * 
	 * 方法概述：根据ID获取账户数据
	 * 描述：根据ID获取账户数据
	 * @param id
	 * @return
	 * 返回类型：
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	@SuppressWarnings("unchecked")
	public Account findById(Integer id) {
		try {
			StringBuffer hql = new StringBuffer();
			
			hql.append("SELECT account ");
			hql.append("FROM Account account ");
			hql.append("LEFT JOIN FETCH account.application ");
			hql.append("LEFT JOIN FETCH account.auths ");
			hql.append("WHERE 1=1 ");
			hql.append("AND account.id = :id ");
			
			Query query = getEntityManager().createQuery(hql.toString());
			query.setParameter("id", id);
			
			List<Account> accounts = (List<Account>)query.getResultList();
			
			if(accounts.isEmpty()){
				return null;
			} else {
				Account account = accounts.get(0);
				return account;
			}
		} catch (RuntimeException re) {
			throw re;
		}
	}

	/**
	 * 方法概述：
	 * 描述：
	 * @param name
	 * @param appid
	 * @return
	 * 返回类型：
	 * 修改人：梁铭显
	 * 修改时间：2013-7-29
	 */
	@SuppressWarnings("unchecked")
	public List<Account> findByNameAndApp(String name,Integer appid) {
		StringBuffer hql = new StringBuffer();
		
		hql.append("SELECT account ");
		hql.append("FROM Account account ");
		hql.append("LEFT JOIN FETCH account.application app ");
		hql.append("WHERE 1=1 ");
		hql.append("AND account.name = :name ");
		hql.append("AND app.id = :appid ");
		
		Query query = getEntityManager().createQuery(hql.toString());
		query.setParameter("name", name);
		query.setParameter("appid", appid);
		
		List<Account> accounts = query.getResultList();
		
		return accounts;
	}
	
	/**
	 * 
	 * 方法概述：获取所有应用数据
	 * 描述：获取所有应用数据
	 * @return
	 * 返回类型：List<Account>
	 * 修改人：梁铭显
	 * 修改时间：2013-8-1
	 */
	@SuppressWarnings("unchecked")
	public List<Account> findAll(){
		StringBuffer hql = new StringBuffer();
		
		hql.append("SELECT account ");
		hql.append("FROM Account account ");
		hql.append("WHERE 1=1 ");
		
		Query query = getEntityManager().createQuery(hql.toString());
		
		List<Account> accounts = query.getResultList();
		
		return accounts;
	}
	
	/**
	 * 
	 * 方法概述：分页获取账户数据
	 * 描述：分页获取账户数据
	 * @param startPage
	 * @param pageSize
	 * @return
	 * 返回类型：List<Account>
	 * 修改人：梁铭显
	 * 修改时间：2013-8-27
	 */
	@SuppressWarnings("unchecked")
	public List<Account> findByPage(int startPage, int pageSize,String queryArg){
		StringBuffer hql = new StringBuffer();
		
		hql.append("SELECT account ");
		hql.append("FROM Account account ");
		hql.append("LEFT JOIN FETCH account.application ");
		hql.append("WHERE 1=1 ");
		
		if(queryArg != null){
			hql.append("AND account.name LIKE :like ");
		}
		
		Query query = getEntityManager().createQuery(hql.toString());
		
		if(queryArg != null){
			query.setParameter("like", "%"+queryArg+"%");
		}
		
		query.setFirstResult(startPage);
		query.setMaxResults(pageSize);
		
		return query.getResultList();
	}
	
	/**
	 * 
	 * 方法概述：根据账户名称查找账户数据
	 * 描述：根据账户名称查找账户数据
	 * @param accountName
	 * @return
	 * 返回类型：List<Account>
	 * 修改人：梁铭显
	 * 修改时间：2013-9-2
	 */
	@SuppressWarnings("unchecked")
	public List<Account> findByName(String accountName){
		StringBuffer hql = new StringBuffer();
		
		hql.append("SELECT account ");
		hql.append("FROM Account account ");
		hql.append("WHERE 1=1 ");
		hql.append("AND account.name LIKE :like ");
		
		Query query = getEntityManager().createQuery(hql.toString());
		
		query.setParameter("like", "%"+accountName+"%");
		
		return query.getResultList();
	}
}